﻿<pre>
知识点一：变量的作用域与生命周期
	1、变量可以被访问的范围叫作用域。
	2、变量从声明出现到自动回收结束是变量的生命周期。
	全局变量：
		声明后的整个页面任何地方均可以访问（这里任何地方特别包含 函数内和函数外）
	
	局部变量：
		函数内声明的变量，只能在函数内使用，函数外无法使用。

	生命周期：
		全局变量一直存在，直到网页关闭。
		局部变量，函数调用完毕，函数内的局部变量消失。
		
	
	
知识点二：作用域链 
	规定：
	1、在函数外部 用不用var声明的变量均为全局变量
	
	2、在函数内部：不用var声明的变量为全局变量，用var声明的为局部变量。
		2.1 如果：函数内部如果存在局部变量的声明，就不会使用外面的全局变量。
		2.2 如果函数内部不存在某个变量，会向上一层找，以此类推，最终找不到显示undefined。
	
	3、 函数优先会扫描自己内部所有声明的变量，如果有就使用自己内部的，如果没有就向其最近的祖先层找起。
		以最近的祖先层为优先，如果一直找到函数外全局还没找到就是undefined。
		这种情况就叫作用域链。	
	
	
	案例讲解以上三点：
	一、函数外带不带var都一样，推荐都带var声明
		<script>
			var i = 1;
			k = 3;
			function F(){
				console.log(i);
				console.log(k);
			}
			F();
			console.log(i);
			console.log(k);
			//说明以上变量，i和k在函数内外都可以被访问。
		</script>
	
	二、函数内带不带var区别大
		<script>
		
			function F(){
				var i = 1;
				k = 3;
				console.log(i);
				console.log(k);
			}
			F();
			console.log(i);		//访问不到
			console.log(k);		//3
	
		</script>
		
	
	三、理解作用域链
		<script>	
			var i = 1;
			function F(){
				var i = 2;
				console.log(i);			//自己内部找到 i=2
				function A(){
					console.log(i);		//先在自己内部找，没找到然后再向上找到i=2
					function B(){	
						var i;
						console.log(i);	//在自己内部找到，undefined					
					}
				}
			}
			F();
			console.log(i);		//1	
		</script>
		
知识点三、声明提升特性
	规定：所有 var 声明 和 function 声明的标识符(函数名和变量名统称标识符)，都具有声明提升特性。
	
	案例1说：var生命的变量会提升
	<script>
		var i = 1;
		function F(){
			console.log(i);		//undefined
			var i = 2;
		}
		F();
		
		//以上函数内部代码与下面相等，因为var声明会提升。
		function F(){
			var i;
			console.log(i);		//undefined
			i = 2;
		}
		//特别注意，仅仅是声明提升，赋值不会提升。
	</script>	

	
	案例2： 函数声明提升
	<script> 
		function F(){
			A = 5;
			function A(){ }
			console.log(A);	//5
		}
		F();
		
		
		//以上函数内部代码与下面相等，因为function声明会提升。
		function F(){
			function A(){ }
			A = 5;			
			console.log(A);	//5
		}
		//特别注意，仅仅是声明提升，赋值不会提升。
	</script>	
	
	案例3：声明提升遇到return也是一样
	<script>
		var i = 66;
		function F() {
			A() //66
			return;
			function A() {
				console.log(i)
			}
		}
		F();
	</script>
	
知识点二：延长局部变量的声明周期
	对引用型局部对象，赋值给全局变量会延长其生命周期。
	<script>
		var i = 1;
		function F(){
			i = {
				w:100
			}
		}
		F(); //调用完毕后i指向的对象依然存在
	</script>

</pre>